热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

表盘|分针_android绘制时钟,canvas学习

篇首语:本文由编程笔记#小编为大家整理,主要介绍了android绘制时钟,canvas学习相关的知识,希望对你有一定的参考价值。自定义View,新建Clic

篇首语:本文由编程笔记#小编为大家整理,主要介绍了android绘制时钟,canvas学习相关的知识,希望对你有一定的参考价值。


自定义View,新建ClickView类继承View


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
public class ClickView extends View
private Paint paint; //表盘外框
private Paint paint1_1; //表中心
private Paint paint2; //表数字
private Paint paint3;//表时针
private Paint paint4;//表分针
private Integer SHI = 0 ;//时
private Integer FEN = 0;//分
private Integer lining = 100; //表盘半径
private Integer lining_sf = 25; //表内径距离
public ClickView(Context context)
super(context);

public ClickView(Context context, @Nullable AttributeSet attrs)
super(context, attrs);

public ClickView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);

public ClickView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
super(context, attrs, defStyleAttr, defStyleRes);

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//外部方法,设置时间并刷新
public void setSHIandFEN(Integer a,Integer b)
this.SHI = a;
this.FEN = b;
//刷新
invalidate();

//绘制
public void onDraw(Canvas canvas)
super.onDraw(canvas);
//初始化
ini();
//画布移动到中心点 画表盘
canvas.translate(getWidth()/2,getHeight()/2);
canvas.drawCircle(0,0,lining,paint);
draw_ini(canvas);
//画时针,分针
setFen(FEN,canvas);
setShi(SHI,FEN,canvas);
//画空心表中心
// canvas.drawOval(new RectF(-5,-5,5,5),paint);
//画实心表中心
paint1_1 = new Paint();
paint1_1.setColor(Color.RED);
paint1_1.setAntiAlias(true);
paint1_1.setStyle(Paint.Style.FILL_AND_STROKE);
paint1_1.setStrokeWidth(3);
canvas.drawCircle(0,0,10,paint1_1);


//初始化笔刷
protected void ini()
paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
paint2 = new Paint();
paint2.setColor(Color.BLUE);
paint2.setAntiAlias(true);
paint2.setStyle(Paint.Style.STROKE);
paint2.setStrokeWidth(1);
paint3 = new Paint();
paint3.setColor(Color.GREEN);
paint2.setAntiAlias(true);
paint3.setStyle(Paint.Style.STROKE);
paint3.setStrokeWidth(3);
paint4 = new Paint();
paint4.setColor(Color.GREEN);
paint4.setAntiAlias(true);
paint4.setStyle(Paint.Style.STROKE);
paint4.setStrokeWidth(2);

//画表盘 ,通过旋转画布实现
protected void draw_ini(Canvas canvas)
canvas.rotate(180,0,0);
for(int i&#61;0;i<60;i&#43;&#43;)
if(i%5&#61;&#61;0)
canvas.drawLine(0,lining,0,lining-12,paint);
if(i&#61;&#61;0)
canvas.drawText(String.valueOf(12),-4f, lining&#43;12f, paint2);
else
canvas.drawText(String.valueOf(i/5),-4f, lining&#43;12f, paint2);

else
canvas.drawLine(0,lining,0,lining-6,paint);

canvas.rotate(6,0,0);


//画时针分针&#xff0c;通过旋转画布实现
private void setShi(Integer SHI,Integer FEN,Canvas canvas)
canvas.save();
if(SHI>&#61;12)SHI-&#61;12;
if(SHI&#61;&#61;0||SHI&#61;&#61;12)
canvas.drawLine(0,0,0,lining-lining_sf-20,paint3);
else
Integer degree &#61; SHI*30&#43;FEN/2;
canvas.rotate(degree,0,0);
canvas.drawLine(0,0,0,lining-lining_sf-20,paint3);

canvas.restore();

private void setFen(Integer FEN,Canvas canvas)
canvas.save();
if(FEN&#61;&#61;0||FEN&#61;&#61;60)
canvas.drawLine(0,0,0,lining-lining_sf,paint4);
else
Integer degree &#61; FEN*6;
canvas.rotate(degree,0,0);
canvas.drawLine(0,0,0,lining-lining_sf,paint4);

canvas.restore();

外部调用
xml文件

android:orientation&#61;"vertical"
android:layout_width&#61;"match_parent"
android:layout_height&#61;"match_parent"
android:background&#61;"#fff"
>
//此处的包名按自己的来
android:id&#61;"&#64;&#43;id/click1"
android:layout_width&#61;"300dp"
android:layout_height&#61;"300dp"
android:layout_marginRight&#61;"50dp"/>
android:layout_width&#61;"wrap_content"
android:layout_height&#61;"wrap_content"
android:id&#61;"&#64;&#43;id/a1"/>

Button a1 &#61; findViewById(R.id.a1);
a1.setOnClickListener(new View.OnClickListener()
&#64;Override
public void onClick(View v)
//外部调用
ClickView view &#61; findViewById(R.id.a9);
view.setSHIandFEN(10,51);

);


推荐阅读
  • 在最近的一系列文章,对midipadAPP,有一个关于一个radialgradiant渲染每个padview利用的探讨,对审美的原因&#x ... [详细]
  • 2021年最详细的Android屏幕适配方案汇总
    1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
  • 安卓中的刮刮卡视图,示例原文:https://www.gee ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
author-avatar
快乐xin_yi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有